package MainPackage;
import GUI.*;
import Buildings.dwelling.*;
import Buildings.threads.*;
import Buildings.*;
import Buildings.dwelling.hotel.*;
import Buildings.net.client.BinaryClient;
import Buildings.net.server.sequental.BinaryServer;
import Buildings.office.*;
import Interfaces.*;
import java.io.*;
import java.util.Iterator;
import java.util.*;

public class Main {
    public static void main(String []args){

        Buildings.setBuildingFactory(new OfficeFactory());
        int m[]=new int[]{2,2};
        Floor s=new DwellingFloor(2);
        s.getMassSpacesInFloor();
        Buildings.createFloor(s.getMassSpacesInFloor());
        // главное окно new BFrame();
        /*
         * 
         * 
         * метод сканер
         * try{
        Scanner s=new Scanner(new FileReader("buildings.txt"));
        Building b=Buildings.readBuilding(s);
        System.out.println(b);
        } catch (FileNotFoundException ex) {

        } catch (IOException ex) {
        }
        * 
        * 
        * 
        Алгоритмы for-each для коллекций реализующие интерфейс java.lang.Iterable
        Building h=new OfficeBuilding(3,new int[]{2,3,4});
        for(Floor f:h){
            System.out.println(f);
        }
        
        Floor s = new DwellingFloor(3);
        for(Space x:s){
            System.out.println(x);
        }*/
        /*
        int n[]=new int[]{2,3,4};
        int m[]=new int[]{2,2};
        int k[]=new int[]{2,2,2,2,2,3};

        Flat f=new Flat(5,200);
        Office o=new Office(202,5);
        Building FlatHouse,OfficeHouse,enotherHouse,ChuckHotel;
    
        //-----------Создание домов
        //обычный метод
       FlatHouse = new Dwelling(3,n);
       OfficeHouse=new OfficeBuilding(2,m);
       ChuckHotel=new Hotel(6,k);
       
       //метод Фабрики
       FlatHouse=Buildings.createBuilding(3, n);
       Buildings.setBuildingFactory(new OfficeFactory());
       OfficeHouse=Buildings.createBuilding(2,m);
       Buildings.setBuildingFactory(new HotelFactory());
       ChuckHotel=Buildings.createBuilding(6,k);
        //-----------Конец создание домов 
       
       */
       
       //BinaryServer.main(null);
//       BinaryServer.main(null);
//       String []argss=new String[]{"buildings.txt","buildingsType.txt","buildingsCash.txt"};
//       BinaryClient.main(argss);
       
       /*запись данных для клиента
       try{
       PrintWriter PW=new PrintWriter("buildings.txt"); //вывод в файл
       Buildings.writeBuilding(OfficeHouse,PW);
       Buildings.writeBuilding(FlatHouse,PW);
       Buildings.writeBuilding(ChuckHotel,PW);
       PW.close();
       }catch(IOException e){
           System.out.println("Ошибка создания файла!");
       }
       
       try{
       PrintWriter PW=new PrintWriter("buildingsType.txt"); //вывод в файл
       Buildings.writeBuildingType(OfficeHouse,PW);
       Buildings.writeBuildingType(FlatHouse,PW);
       Buildings.writeBuildingType(ChuckHotel,PW);
       PW.close();
       }catch(IOException e){
           System.out.println("Ошибка создания файла!");
       }
       
       try{
       ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("SerialBuildings.txt"));
       out.writeObject(FlatHouse);
       out.writeObject(OfficeHouse);
       out.writeObject(ChuckHotel);
       out.close();
       }catch(IOException e){
           System.out.println("Ошибка создания файла!");
       }
       */
       //синхронизация
//       Floor fl=new DwellingFloor(5);
//       ElementalSemaphore sema=new ElementalSemaphore(fl);
//       SequentalRepairer w=new SequentalRepairer(sema,"w");
//       SequentalCleaner q=new SequentalCleaner(sema,"q");  
       
//       Floor fl=new DwellingFloor(4);
//       Thread d=new Repairer(fl);
//       Thread x=new Cleaner(fl);
//       x.interrupt();
//       try{
//       Thread.sleep(2000);
//       }catch(InterruptedException e){
//       }
//       d.interrupt();

//      
//       Building Super=new Dwelling(9,new int[]{4,4,3,3,3,3,3,4,4});
//       OfficeFloor q=new OfficeFloor(4);
//       HotelFloor w=new HotelFloor(4);
//       Super.setFloor(7,w);
//       Super.setFloor(8,w);
//       Super.setFloor(0, q);
//       Super.setFloor(1, q);
//       Office bestOf=new Office(400,6);
//       Flat bestFlat1=new Flat(5,220);
//       Flat bestFlat2=new Flat(4,160);
//       Flat bestFlat3=new Flat(8,550);
//       Super.setSpaceInBuilding(3, bestOf);
//       Super.setSpaceInBuilding(7, bestFlat1);
//       Super.setSpaceInBuilding(12, bestFlat1);
//       Super.setSpaceInBuilding(15, bestFlat2);
//       Super.setSpaceInBuilding(20, bestFlat3);
//       Super.setSpaceInBuilding(30, bestFlat1);
//       ((HotelFloor)Super.getFloor(7)).setStarToFloor(5);
//       ((HotelFloor)Super.getFloor(8)).setStarToFloor(4);
//       System.out.println(Super);
//       System.out.println("Лучшее помещение "+Super.getBestSpace());
//       {//System.out.println(((Hotel)Super).getBestSpace());-нельзя
//       enotherHouse=new Hotel(Super.getFloorMass());
//       System.out.println("Лучшее помещение в отельном смысле "+((Hotel)enotherHouse).getBestSpace());
//       }
//       System.out.println("-----------------------");
       /*
       //Работа Итераторов
       Iterator ios=OfficeHouse.iterator();
       int h;
       for(h=0;ios.hasNext();h++,ios.next());
       Iterator it=OfficeHouse.iterator();
       for(;it.hasNext();h++,it.next());
       */
       /*//Проверки на равенство
       Building _FlatHouse=Buildings.createBuilding(3, n);
       boolean s=FlatHouse.equals(_FlatHouse);
       Buildings.setBuildingFactory(new OfficeFactory());
       Building _OfficeHouse=Buildings.createBuilding(2,m);
       boolean d=_OfficeHouse.equals(ChuckHotel);
       Buildings.setBuildingFactory(new HotelFactory());
       Building _ChuckHotel=Buildings.createBuilding(6,k);
       boolean fx=ChuckHotel.equals(_ChuckHotel);
       * /

* 
* 
*       Клонирование
        System.out.println(ChuckHotel);
       OfficeFloor of=new OfficeFloor(3);
       ChuckHotel.setFloor(0, of);
       System.out.println(ChuckHotel);
       of.setSpaceInFloor(2, f);
       System.out.println(ChuckHotel);
       ChuckHotel.setSpaceInBuilding(2, f);
       System.out.println(ChuckHotel);
       
       
       /* Методы чтения и записи зданий в различного рода потоки
       
       //Запись и чтение символьного потока
       try{
       PrintWriter PW=new PrintWriter("OutputChar.txt"); //вывод в файл
       //PrintWriter PW=new PrintWriter(new OutputStreamWriter(System.out)); //вывод на экран
       Buildings.writeBuilding(OfficeHouse,PW);
       PW.close();
       }catch(IOException e){
           System.out.println("Ошибка создания файла!");
       }
       try{
       BufferedReader BR=new BufferedReader(new FileReader("OutputChar.txt")); //чтение из файла
       //BufferedReader BR=new BufferedReader(new InputStreamReader(System.in)); //чтение с консоли
       enotherHouse=Buildings.readBuilding(BR);
       BR.close(); //переменная на файл, при закрытии, обнуляется
       }catch(IOException e){
           System.out.println("Ошибка открытия файла!");
       }
       
       //Запись и чтение байтового потока
       try{
       FileOutputStream OOS=new FileOutputStream("OutputBit.txt");//вывод в файл
       //OutputStream OOS=new FilterOutputStream(System.out);//вывод на экран
       Buildings.outputBuilding(OfficeHouse,OOS);
       OOS.close();
       }catch(IOException e){
           System.out.println("Ошибка создания файла!");
       }
       try{
       FileInputStream FIS=new FileInputStream("OutputBit.txt");
       enotherHouse=Buildings.inputBuilding(FIS);
       FIS.close(); //переменная на файл, при закрытии, обнуляется
       }catch(IOException e){
           System.out.println("Ошибка открытия файла!");
       }
       
      
       //сериализация
       try{
       ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("FlatHouse.txt"));
       out.writeObject(FlatHouse);
       out.close();
       }catch(IOException e){
           System.out.println("Ошибка создания файла!");
       }
       //десериализация
       try{
       ObjectInputStream in=new ObjectInputStream(new FileInputStream("FlatHouse.txt"));
       enotherHouse=(Building)in.readObject();
       in.close(); //переменная на файл, при закрытии, обнуляется
       }catch(IOException e){
           System.out.println("Ошибка открытия файла!");
       }catch(ClassNotFoundException e){
           System.out.println("Неизвестный тип класса!");
       }
       */
//       Обменная операция
//       FlatHouse.setSpaceInBuilding(0, f);
//       OfficeHouse.setSpaceInBuilding(0, o);
//       PlacementExchanger.exchangeFloorRooms(OfficeHouse.getFloor(0), 0, FlatHouse.getFloor(0), 0);


//  Офис в жилом здании      FlatHouse.addSpaceInBuilding(3, o);//добавлен на первый этаж
//Квартира в офисном здании  OfficeHouse.addSpaceInBuilding(3, f);//добавлен на второй этаж в начало
    
       
// Офисное здание с жилым этажом       OfficeHouse.setFloor(1,FlatHouse.getFloor(2));
// Жилое здание с офисным этажом       FlatHouse.setFloor(2, OfficeHouse.getFloor(1));     
    } 
}

